<?php
/**
 * Created by PhpStorm.
 * User: RUNFA
 * Date: 2015/9/5
 * Time: 15:44
 */

namespace Admin\Model;
use Think\Upload;
use Think\Image;
use Think\Model;
use Think\Html5Upload;
class AttachmentModel extends Model
{
	/**
	 * 自动完成
	 * @var array
	 */
	protected $_auto = array(
		array('status', 1, self::MODEL_INSERT),
		array('create_time', NOW_TIME, self::MODEL_INSERT),
	);

	/**
	 * 文件上传
	 * @param  array  $files   要上传的文件列表（通常是$_FILES数组）
	 * @param  array  $setting 文件上传配置
	 * @param  string $driver  上传驱动名称
	 * @param  array  $config  上传驱动配置
	 * @return array           文件上传成功后的信息
	 */
	public function upload($files, $setting, $driver = 'Local', $config = null,$groupid){
		/* 上传文件 */
		$setting['callback'] = array($this, 'isFile');
		$setting['removeTrash'] = array($this, 'removeTrash');
		//设置路径
		$_real_root_path =$setting['rootPath'];  //这是自定义的根目录
		$autoImgPath=''; //自定义图片目录
		if(!empty($setting['original_auto'])){
			$autoImgPath=is_login().'/'.date('Y-m-d').'/';   //以用户id作为原图路径
		}
		//用原图的目录作为保存文件的根目录
		$setting['rootPath'] = $_real_root_path.$setting['originalPath'].$autoImgPath;  //原图路径
		$original_img_path=$setting['rootPath'];
		//不存在
		if(!file_exists($original_img_path)){
			mkdir($original_img_path,0777,true);  //创建新的目录文件夹
		}
		$Upload = new Upload($setting, $driver, $config);
		$info   = $Upload->upload($files);
		if($info){ //文件上传成功，记录文件信息
			//配置缩略图目录
			$thumbnailPath=$_real_root_path.$setting['thumbnailPath'].$autoImgPath;  //缩略图根目录
			if(!file_exists($thumbnailPath)){
				mkdir($thumbnailPath,0777,true);   //创建新的缩略图路径
			}
			foreach ($info as $key => &$value){
				/* 已经存在文件记录 */
				if(isset($value['id']) && is_numeric($value['id'])){
					continue;
				}
				/*记录文件信息  orginPath rootPath savepath*/
				$_oring_path =$original_img_path.$value['savename'];	//在模板里的url路径,原始图片位置
				$value['path'] =substr($thumbnailPath,1).$value['savename']; //缩略图位置
				//原始图片的名称
				$org_name=$value['name'];
				$last_pot_index=strrpos($org_name,'.');//查找最后一个点的位置，以获取名称
				$value['attachment_name']=substr($org_name,0,$last_pot_index);
				//自定义的图片名称
				$savename=$value['savename'];
				$last_pot_index2=strrpos($savename,'.');//查找最后一个点的位置，以获取名称
				$value['file_name']=substr($savename,0,$last_pot_index2);
				$value['file_size'] =$value['size'];
				$value['sort'] =$key;  //排序
				$value['file_extension_name'] = $value['ext'];
				$value['create_uid'] =UID;
				$value['attachment_groupid'] =$groupid;   //图片分组id
				$value['original_dir'] =$original_img_path;   //原图根目录
				$value['thumbnail_dir'] =$thumbnailPath;   //缩略图根目录
				//如果是图片就压缩图片，并把压缩后的图片大小记录到数据库
				//缩小图片的插件
				Vendor('UploadPicsFileResize');
				$pic_array=array('jpg','jpeg','png','gif','bmp');
				if($this->create($value) && ($id = $this->add())){
					$value['id'] = $id;
					if(in_array(strtolower($value['ext']),$pic_array)){
						//生成缩略图
						$image = new \Think\Image();
						$image->open($_oring_path);
						$imageModel=$setting['image_model'];   //图片处理模式
						if($imageModel==2){
							//按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.jpg
							$image->thumb($setting['thumb_width'], $setting['thumb_height'],\Think\Image::IMAGE_THUMB_FIXED)
								->save($thumbnailPath.$value['savename']);
						}else{
							//按原图的等比率生成新的图片，并保存于路径：$thumbnailPath.$value['savename']
							$image->thumb($setting['thumb_width'], $setting['thumb_height'])
								->save($thumbnailPath.$value['savename']);
						}
					}
				} else {
					//TODO: 文件上传成功，但是记录文件信息失败，需记录日志
					unset($info[$key]);
				}
			}
			return $info; //文件上传成功
		} else {
			$this->error = $Upload->getError();
			return false;
		}
	}

    /*
     *文件上传
     * $fn string 前端返回的上传方法名称
     * $file array 前端html5解析返回文件信息
     * $setting array 手动配置的为文件信息
     * */
    public function html5FileUpload($fn,$file,$setting){
        //设置路径
        $_real_root_path =$setting['rootPath'];   //这是自定义的根目录
        //默认文件原始保存的绝对路径
        $original_img_path=$_real_root_path.date('Ymd').'/';
        //原图保存的文件夹名称
        $original_folder_name=$setting['original_folder_name'];
        if(!empty($original_folder_name)){
            $setting['subPath']=$original_folder_name.'/';
            //文件原始保存的绝对路径
            $original_img_path=$_real_root_path.$original_folder_name.'/';
        }
        $autoSubPath='';   //原图自定义文件子目录路径
        if(!empty($setting['original_auto'])){
            $autoSubPath=is_login().'/'.date('Y-m-d').'/';   //以用户id作为原图路径
            $setting['subPath']=$setting['subPath'].$autoSubPath; //文件子目录路径
            $original_img_path=$original_img_path.$autoSubPath;
        }
        //原图目录如果不存在,则创建新的目录
        if(!file_exists($original_img_path)){
            mkdir($original_img_path,0777,true);  //创建新的目录文件夹
        }
        //调用html5的上传类
        $Upload = new Html5Upload($file,$setting);
        $info   = $Upload->$fn();
        if($info&&!empty($info['start'])){ //文件上传成功，记录文件信息
            //配置缩略图目录
            $thumbnail_folder_name=$setting['thumbnail_folder_name']?$setting['thumbnail_folder_name']:'thumbnail';
            //缩略图绝对路径
            $thumbnailPath=$_real_root_path.$thumbnail_folder_name.'/'.$autoSubPath;
            if(!file_exists($thumbnailPath)){ //创建新的缩略图路径
                mkdir($thumbnailPath,0777,true);
            }
            $value=$info['info'];
            //插入数据库
            $startId=$info['start']; //图片的位置标识
            $data['attachment_name']=$value['filename'];
            $data['file_name']=$value['token'];
            $data['file_extension_name']=$value['extension'];
            $data['attachment_groupid']=$setting['groupId'];  //分组
            $data['original_dir']=$original_img_path; //原图路径
            $data['thumbnail_dir']=$thumbnailPath;   //缩略图路径
            $data['file_size']=$value['size'];  //大小
            $data['sort']=0;
            $data['create_uid']=is_login();
            $data['create_time']=time();
            $data['status']=1;
            $id=$this->add($data);
            $info['info']['id']=$id;  //返回新增的id
            if(!empty($id)){
                //如果是图片就压缩图片，并把压缩后的图片大小记录到数据库
                Vendor('UploadPicsFileResize');    //缩小图片的插件
                $pic_array=array('jpg','jpeg','png','gif','bmp');
                if(in_array(strtolower($value['extension']),$pic_array)){
                    //原图保存路径(绝对路径)
                    $original_img_file=$original_img_path.$value['saveName'];
                    //缩略图保存路径(绝对路径)
                    $thumbnail_img_file=$thumbnailPath.$value['saveName'];
                    $info['info']['thumb_path']=$thumbnailPath; //保存路径
                    //生成缩略图
                    $image = new \Think\Image();
                    $image->open($original_img_file);
                    $imageModel=$setting['image_model'];   //图片处理模式
                    if($imageModel==2){
                        //按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.jpg
                        $image->thumb($setting['thumb_width'], $setting['thumb_height'],\Think\Image::IMAGE_THUMB_FIXED)
                            ->save($thumbnail_img_file);
                    }else{
                        //按原图的等比率生成新的图片，并保存于路径：$thumbnailPath.$value['savename']
                        $image->thumb($setting['thumb_width'], $setting['thumb_height'])
                            ->save($thumbnail_img_file);
                    }
                }
            }
        }
        if(!empty($info['info'])){
            $info['info']['original_path']=$original_img_path;  //原图保存路径
        }
        return $info;
    }

    /*
     *h5文件上传
     * */
    public function h5FileUpload($fn,$file,$setting){
         //设置路径
        $_real_root_path =$setting['rootPath'];   //这是自定义的根目录
        //默认文件原始保存的绝对路径
        $original_img_path=$_real_root_path.date('Ymd').'/';
        //原图保存的文件夹名称
        $original_folder_name=$setting['original_folder_name'];
        if(!empty($original_folder_name)){
            $setting['subPath']=$original_folder_name.'/';
            //文件原始保存的绝对路径
            $original_img_path=$_real_root_path.$original_folder_name.'/';
        }
        $autoSubPath='';   //原图自定义文件子目录路径
        if(!empty($setting['original_auto'])){
            $autoSubPath=is_login().'/'.date('Y-m-d').'/';   //以用户id作为原图路径
            $setting['subPath']=$setting['subPath'].$autoSubPath; //文件子目录路径
            $original_img_path=$original_img_path.$autoSubPath;
        }
        //原图目录如果不存在,则创建新的目录
        if(!file_exists($original_img_path)){
            mkdir($original_img_path,0777,true);  //创建新的目录文件夹
        }
        //调用html5的上传类
        $Upload = new Html5Upload($file,$setting);
        $info   = $Upload->$fn();
        return $info;
    }


    /**
	 * 下载指定文件
	 * @param  number  $root 文件存储根目录
	 * @param  integer $id   文件ID
	 * @param  string   $args     回调函数参数
	 * @return boolean       false-下载失败，否则输出下载文件
	 */
	public function download($root, $id, $callback = null, $args = null){
		/* 获取下载文件信息 */
		$file = $this->find($id);
		if(!$file){
			$this->error = '不存在该文件！';
			return false;
		}

		/* 下载文件 */
		switch ($file['location']) {
			case 0: //下载本地文件
				$file['rootpath'] = $root;
				return $this->downLocalFile($file, $callback, $args);
			case 1: //TODO: 下载远程FTP文件
				break;
			default:
				$this->error = '不支持的文件存储类型！';
				return false;

		}

	}

	/**
	 * 检测当前上传的文件是否已经存在
	 * @param  array   $file 文件上传数组
	 * @return boolean       文件信息， false - 不存在该文件
	 */
	public function isFile($file){
		if(empty($file['md5'])){
			throw new \Exception('缺少参数:md5');
		}
		/* 查找文件 */
		$map = array('md5' => $file['md5'],'sha1'=>$file['sha1'],);
		return false;
		//return $this->field(true)->where($map)->find();
	}

	/**
	 * 下载本地文件
	 * @param  array    $file     文件信息数组
	 * @param  callable $callback 下载回调函数，一般用于增加下载次数
	 * @param  string   $args     回调函数参数
	 * @return boolean            下载失败返回false
	 */
	private function downLocalFile($file, $callback = null, $args = null){
		if(is_file($file['rootpath'].$file['savepath'].$file['savename'])){
			/* 调用回调函数新增下载数 */
			is_callable($callback) && call_user_func($callback, $args);

			/* 执行下载 */ //TODO: 大文件断点续传
			header("Content-Description: File Transfer");
			header('Content-type: ' . $file['type']);
			header('Content-Length:' . $file['size']);
			if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { //for IE
				header('Content-Disposition: attachment; filename="' . rawurlencode($file['name']) . '"');
			} else {
				header('Content-Disposition: attachment; filename="' . $file['name'] . '"');
			}
			readfile($file['rootpath'].$file['savepath'].$file['savename']);
			exit;
		} else {
			$this->error = '文件已被删除！';
			return false;
		}
	}
	/**
	 * 清除数据库存在但本地不存在的数据
	 * @param $data
	 */
	public function removeTrash($data){
		$this->where(array('id'=>$data['id'],))->delete();
	}
}